/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.fiap.sir.api;

import br.com.fiap.sir.beans.Node;
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;
import javax.swing.JOptionPane;

/**
 *
 * @author Felipe
 */
public class Grafos {

    private HashMap<String,Node> matriz;
    private Integer cont;

    public Grafos(){
        this.cont = 0;
    }

    public Integer getCont() {
        return cont;
    }

    public void setCont(Integer cont) {
        this.cont = cont;
    }

    public HashMap<String, Node> getMatriz() {
        return matriz;
    }

    public void setMatriz(HashMap<String, Node> matriz) {
        this.matriz = matriz;
    }





    /**
    função buscaArt(vertice v){
	visitar o vertice v;
	low(v)=num(v)=cont++
	para cada w adjacente v:
		se w não visitado
			pai(w)=v;
			buscarArt(w);
			se(low(w)>=num(v)
				v é articulação
			low(v)=min(low(v),low(w));
		senao
			se (w nao é pai(v))
				low(v)=min(low(v),num(w));
    }
    */

    public void buscaArt(Node v){
        v.setVisitado(Boolean.TRUE);
        
        this.cont++;
        v.setLow(cont);
        v.setNum(cont);
        if(v.getLigacoes() != null){
            for(String aux:v.getLigacoes()){
               Node w =  matriz.get(aux);

               if(w == null){
                   w = new Node();
                   w.setRm(aux);
                   matriz.put(aux,w);
               }

               if(!w.isVisitado()){
                    w.setPai(v.getRm());
                    //Atualiza e busca...
                    matriz.put(aux,w);
                    buscaArt(w);
                    if(w.getLow() >= v.getNum()){
                        v.setArticulacao(Boolean.TRUE);
                    }
                    v.setLow(Math.min(v.getLow(), w.getLow()));
               }else{
                    if(!w.getRm().equals(v.getPai())){
                        v.setLow(Math.min(v.getLow(),w.getNum()));
                    }
               }
               //Atualiza a matriz
               matriz.put(v.getRm(),v);
               matriz.put(aux,w);
            }
        }
        matriz.put(v.getRm(),v);
    }

    /**
     * Limpa as flags da matriz adjacente.
     */
    public static HashMap<String,Node> limpaFlags(HashMap<String,Node> matriz){
        Set<String> keys = matriz.keySet();
        
        for(String key : keys){
            Node atual = matriz.get(key);
            atual.setArticulacao(false);
            atual.setVisitado(false);
            atual.setFimNivel(false);
            matriz.put(key, atual);
        }

        return matriz;
    }




    }

